package com.zzyl.nursing.service.impl;

import java.util.Arrays;
import java.util.List;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.zzyl.common.core.domain.AjaxResult;
import com.zzyl.oss.AliyunOssUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.zzyl.nursing.mapper.CateringCareMenuMapper;
import com.zzyl.nursing.domain.CateringCareMenu;
import com.zzyl.nursing.service.ICateringCareMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.web.multipart.MultipartFile;

/**
 * 关怀食谱Service业务层处理
 *
 * @Author: alexis
 * @Date: 2024-12-30
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class CateringCareMenuServiceImpl extends ServiceImpl<CateringCareMenuMapper, CateringCareMenu> implements ICateringCareMenuService {

    private final CateringCareMenuMapper cateringCareMenuMapper;
    private final AliyunOssUtils aliyunOssUtils;

    /**
     * 查询关怀食谱
     *
     * @param id 关怀食谱主键
     * @return 关怀食谱
     */
    @Override
    public CateringCareMenu selectCateringCareMenuById(Long id) {
        CateringCareMenu menu = cateringCareMenuMapper.selectById(id);
        if (menu != null && StrUtil.isNotBlank(menu.getDishImage())) {
            menu.setDishImage(processImageUrl(menu.getDishImage()));
        }
        return menu;
    }

    /**
     * 查询关怀食谱列表
     *
     * @param cateringCareMenu 关怀食谱
     * @return 关怀食谱集合
     */
    @Override
    public List<CateringCareMenu> selectCateringCareMenuList(CateringCareMenu cateringCareMenu) {
        List<CateringCareMenu> list = cateringCareMenuMapper.selectCateringCareMenuList(cateringCareMenu);
        // 处理图片URL
        for (CateringCareMenu menu : list) {
            if (StrUtil.isNotBlank(menu.getDishImage())) {
                menu.setDishImage(processImageUrl(menu.getDishImage()));
            }
        }
        return list;
    }

    /**
     * 新增关怀食谱
     *
     * @param cateringCareMenu 关怀食谱
     * @return 结果
     */
    @Override
    public int insertCateringCareMenu(CateringCareMenu cateringCareMenu) {
        // 数据校验
        validateCareMenu(cateringCareMenu);
        return cateringCareMenuMapper.insert(cateringCareMenu);
    }

    /**
     * 修改关怀食谱
     *
     * @param cateringCareMenu 关怀食谱
     * @return 结果
     */
    @Override
    public int updateCateringCareMenu(CateringCareMenu cateringCareMenu) {
        // 数据校验
        validateCareMenu(cateringCareMenu);
        return cateringCareMenuMapper.updateById(cateringCareMenu);
    }

    /**
     * 批量删除关怀食谱
     *
     * @param ids 需要删除的关怀食谱主键集合
     * @return 结果
     */
    @Override
    public int deleteCateringCareMenuByIds(Long[] ids) {
        return cateringCareMenuMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 删除关怀食谱信息
     *
     * @param id 关怀食谱主键
     * @return 结果
     */
    @Override
    public int deleteCateringCareMenuById(Long id) {
        return cateringCareMenuMapper.deleteById(id);
    }

    /**
     * 根据食谱类型查询关怀食谱
     *
     * @param menuType 食谱类型
     * @return 关怀食谱集合
     */
    @Override
    public List<CateringCareMenu> selectCareMenuByType(Integer menuType) {
        List<CateringCareMenu> list = cateringCareMenuMapper.selectCareMenuByType(menuType);
        // 处理图片URL
        for (CateringCareMenu menu : list) {
            if (StrUtil.isNotBlank(menu.getDishImage())) {
                menu.setDishImage(processImageUrl(menu.getDishImage()));
            }
        }
        return list;
    }

    /**
     * 上传菜品图片
     *
     * @param file 图片文件
     * @return 上传结果
     */
    @Override
    public AjaxResult uploadDishImage(MultipartFile file) {
        try {
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("请选择要上传的图片");
            }

            // 检查文件类型
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || !isValidImageFile(originalFilename)) {
                return AjaxResult.error("只支持jpg、jpeg、png、gif格式的图片");
            }

            // 检查文件大小（限制为5MB）
            if (file.getSize() > 5 * 1024 * 1024) {
                return AjaxResult.error("图片大小不能超过5MB");
            }

            // 上传到阿里云OSS
            String imageUrl = aliyunOssUtils.uploadFile(file);
            if (StrUtil.isBlank(imageUrl)) {
                return AjaxResult.error("图片上传失败");
            }

            return AjaxResult.success("图片上传成功", imageUrl);
        } catch (Exception e) {
            log.error("上传菜品图片失败", e);
            return AjaxResult.error("图片上传失败：" + e.getMessage());
        }
    }

    /**
     * 处理图片URL
     */
    @Override
    public String processImageUrl(String imageUrl) {
        if (StrUtil.isBlank(imageUrl)) {
            return imageUrl;
        }
        // 如果已经是完整URL，直接返回
        if (imageUrl.startsWith("http://") || imageUrl.startsWith("https://")) {
            return imageUrl;
        }
        // 否则直接返回，因为uploadFile已经返回完整URL
        return imageUrl;
    }

    /**
     * 验证图片文件格式
     */
    private boolean isValidImageFile(String filename) {
        String lowerCaseFilename = filename.toLowerCase();
        return lowerCaseFilename.endsWith(".jpg") || 
               lowerCaseFilename.endsWith(".jpeg") || 
               lowerCaseFilename.endsWith(".png") || 
               lowerCaseFilename.endsWith(".gif");
    }

    /**
     * 数据校验
     */
    private void validateCareMenu(CateringCareMenu cateringCareMenu) {
        if (cateringCareMenu.getMenuType() == null) {
            throw new RuntimeException("食谱类型不能为空");
        }

        if (cateringCareMenu.getMenuType() < 1 || cateringCareMenu.getMenuType() > 5) {
            throw new RuntimeException("食谱类型不正确（1：糖尿病，2：高血压，3：素食，4：低盐，5：低脂）");
        }

        if (StrUtil.isBlank(cateringCareMenu.getDishName())) {
            throw new RuntimeException("菜品名称不能为空");
        }

        if (StrUtil.isBlank(cateringCareMenu.getSuitableCrowd())) {
            throw new RuntimeException("适用人群不能为空");
        }

        if (cateringCareMenu.getStatus() == null) {
            cateringCareMenu.setStatus(1); // 默认启用
        }
    }
} 